package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流--传输对象---实现序列化接口Serializable：功能：将对象转换为二进制
 * 版本号：一定要写，对象写出与读入   必须需要统一版本号
 * <p>
 * ObjectOutputStream   对象输出流    写出---person.java
 * ObjectInputStream    对象输入流    读入---person.java
 */
public class ObjectIO {
    //需求： 将Person，java 文件  变成对象   写出  --序列化
    @Test
    public void testOOS() throws IOException {
        //传输对象：创建实现序列化接口的对象
        Person p = new Person();
        p.setNames("寒梅卷");
        //String[] say=new String[]{}
        //字符串数组:动态数组传输--给定元素决定数组长度
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});
        //传输符合条件对象--输出流---xxx.obj 文件是一种对象保存格式
        // System.out.println(p.toString());
        //创建低级流--写出   对象格式：person.obj
        FileOutputStream fos = null;
        //高级流：ObjectOutputStream
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream("person.obj");
            oos = new ObjectOutputStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null)
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        /**
         * writerObject(Object obj)--写出对象
         * 作用：将给定对象按照其接口进行转换，转换为一组“组”字节
         * 在通过处理的流写出，写出格式：xxx.obj
         * 抛出异常：NotSerializableException   没有实现序列化接口
         * 原因：传输对象上没有实现Serializable序列化接口
         * Person类---去掉实现序列化接口：Serializable
         * 对象文件传输需要经过2个步骤：
         * 1.通过对象输出流将Person类转换为一组“组”字节，这个过程叫做对象的序列化
         * 2.将序列化后的字节在通过字节流【低级流】写出到项目中【硬盘】进行长久保存，这个过程叫做数据持久化！
         */
        oos.writeObject(p);
        System.out.println("写出成功~~");
    }

    /**
     * ObjectInputStream  对象输入流/反序列化
     * 反序列化---二进制转换为对象
     * InvalidClassException  反序列化出现异常：版本号不匹配
     * ClassNotFoundException    没有这个类型异常
     * 产生原因：读入对象不正确，永久保存数据，类型读入不对
     * person1.class    person.obj
     * person2.class
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        //创建输入流---搬运person.obj
        FileInputStream fis = null;
        //创建高级流---对象输入流
        ObjectInputStream ois = null;
        try {
            fis = new FileInputStream("person.obj");
            ois = new ObjectInputStream(fis);
            System.out.println(ois.readObject());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ois!=null)
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        //readObject() 返回读取的对象，，反序列化操作
        //ois.readObject();
    }
}
